package com.fingard.threading;

import java.util.HashMap;

/**ResetEvent，用于线程间同步*/
public class ResetEvent {
	
	/**根据key记录所用的EventObject对象*/
	private HashMap<String, EventObject> mapEvtObjs;

	public ResetEvent(){
		mapEvtObjs = new HashMap<String, EventObject>();
	}
	
	/**wait
	 * @param pEvtKey：key
	 * @param pExptSetCount：预期计数值，达到则唤醒，即notifyAll
	 * @param pTimeoutMil：超时时间（线程最大等待时间），单位：秒
	 * @throws InterruptedException 
	 * */
	public boolean waitOne(String pEvtKey, int pExptSetCount, int pTimeoutSec) throws InterruptedException{
		synchronized(mapEvtObjs){
			mapEvtObjs.put(pEvtKey, new EventObject(pExptSetCount));
		}
		try{
			long timeoutMil = pTimeoutSec * 1000;
			return mapEvtObjs.get(pEvtKey).waitOne(timeoutMil);
		}catch(InterruptedException ex){
			throw(ex);
		}finally{
			synchronized(mapEvtObjs){
				mapEvtObjs.remove(pEvtKey);
			}
		}
	}
	
	/**set完成数加1，如果到达预期值，则取消阻塞，执行notifyAll
	 * @param pEvtKey：key
	 * @throws Exception 
	 * */
	public boolean setOne(String pEvtKey) throws Exception{
		if(mapEvtObjs.containsKey(pEvtKey)){
			try{
				if(mapEvtObjs.get(pEvtKey).setOne()){
					synchronized(mapEvtObjs){
						mapEvtObjs.remove(pEvtKey);
					}
					return true;
				}else{
					return false;
				}
			}catch(InterruptedException ex){
				synchronized(mapEvtObjs){
					mapEvtObjs.remove(pEvtKey);
				}
				throw(ex);
			}
		}else{
			return false;
			//throw new Exception("ResetEvent不存在键值为"+pEvtKey+"的同步对象");
		}
	}

}
